import Notification from '@/api/sys/notification/notification.js'

/**
 * 消息通知(浏览器)
 * @Param title 标题
 * @Param body 内容
 * @Param dataJson webstock后台调用发送通知传递的JSON
 * 用例 :
 *  openInfo() {
 *    // 实例化
 *    var notify = new WebNotify('title', 'body')
 *    // 声明事件
 *    var methods = {
 *      click: () => { this.msgError('点击') notify.close() },
 *      show: () => { this.msgError('显示') },
 *      close: () => { this.msgError('关闭') }
 *    }
 *    // 注册事件
 *    notify.register(methods)
 *  }
 */
export default class WebNotify {
  constructor(title, body) {
    this.title = title
    this.body = body
    this.notify = init(this.title, this.body)
    new Audio(require('@/api/sys/notification/Notify.wav')).play()
  }
  // 注册监听事件
  addEvent(listeningForEvents) {
    eventRegister(this.notify, listeningForEvents).then(() => {})
  }
  // 关闭通知
  close() {
    this.notify.notificationInstance.pop()[this.notify.close_id].close()
  }
}

/**
 *  大多数浏览器消息显示样式及关闭的时长不同
 *  建议：showDialog: false
 *  delay: 1000 到 5000之间
 */
export function init(title, body) {
  // 实例化消息通知
  return new Notification(title, {
    body: body,
    icon: 'https://jbs.smyun.net/favicon.ico',
    dir: 'auto',
    showDialog: true,
    delay: 10000
  })
}

// 事件注册
export async function eventRegister(notice, userSelectObj) {
  // 查看浏览器是否支持Notification和消息通知状态
  const r = await notice.isSupport()
  if (r['isGranted'] === 'granted') {
    notice.initNoticeEvent(userSelectObj)
    // 此方法为：显示消息通知框，所以事件注册需在此方法之前，否则事件无效！！！
    await notice.noticeAgree().then(() => {
      notice.clearNotice()
    })
  }
}
